package com.lujianbuping.system.opportunityprojectmanagementsystem.utils.obj;

import java.lang.reflect.AccessibleObject;
import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.List;

public class ObjectAnalyzer {

	private ArrayList<Object> visited = new ArrayList<>();

	/**
	 * 任意一个对象的toString方法，包含所有的字段和值，包含所有引用其他类型的toString
	 * @param obj
	 * @return
	 */
	public String toString(Object obj) {

		if (obj == null) {
			return "null";
		}

		if (visited.contains(obj)) {
			return "...";
		}
		visited.add(obj);
		Class<?> clz = obj.getClass();
		if (clz == String.class)
			return (String) obj;
		if (clz.isArray()) {
			String l = clz.getComponentType() + "[]{";
			for (int i = 0; i < Array.getLength(obj); i++) {
				if (i > 0) {
					l += ", \n";
				}
				Object value = Array.get(obj, i);
				if (clz.getComponentType().isPrimitive()) {
					l += value;
				} else {
					l += toString(value);
				}
			}

			return l + "}";
		}

//		String res = clz.getName();
		StringBuilder sb = new StringBuilder();
		sb.append(clz.getName());
		do {
//			res += "{";
			sb.append("{");
			Field[] fields = clz.getDeclaredFields();
			AccessibleObject.setAccessible(fields, true);
			
			for (Field field : fields) {
				if (!Modifier.isStatic(field.getModifiers())) {
//					if (!res.endsWith("[")) {
					if (!sb.toString().endsWith("[")&& !sb.toString().endsWith("{")) {
//						res += ", ";
						sb.append(", ");
					}
//					res += field.getName() + "=";
					sb.append(field.getName()).append("=");

					try {
						Class<?> type = field.getType();
						Object value = field.get(obj);
						if (type.isPrimitive()) {
//							res += value;
							sb.append(value);
						} else {
//							res += toString(value);
							sb.append(toString(value));
						}
					} catch (Exception e) {
						e.printStackTrace();
					}
				}
			}
//			res += "}";
			sb.append("}");
			clz = clz.getSuperclass();
		} while (clz != null);
		
//		return res;
		return sb.toString();

	}
	
	
	
	public static void main(String[] args) {
//		System.out.println("["=="{");
		List<Integer> list = new ArrayList<>();
		for (int i = 1; i < 10; i++) {
			list.add(i);
		}
		System.out.println(new ObjectAnalyzer().toString(list));
	}
	


}
